package org.example.controller;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.protocol.Protocol;
import org.example.bean.ChatSession;
import org.example.bean.ChatSessionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

@RestController
@RequestMapping("/ai")
public class WenController {

    private static final String DASHSCOPE_API_KEY = "sk-872faded60c844619d557e1c2567c230";
    private static final String SYSTEM_PROMPT = "你的名字叫小白，请你高兴的回答问题"; // 固定系统提示

    @Autowired // 注入会话管理器
    private ChatSessionManager sessionManager;
    List<Message> messages = new ArrayList<>();

    /**
     * 支持会话记忆的接口：接收chatId（会话标识）、prompt（新问题）、files（可选文件）
     */
    @PostMapping("/chat")
    public String callWithMessage(
            @RequestPart(value = "chatId", required = false) String chatId, // 会话ID（前端传递）
            @RequestPart("prompt") String prompt, // 新的用户提问
            @RequestPart(value = "files", required = false) MultipartFile[] files // 可选文件
    ) throws NoApiKeyException, InputRequiredException, ApiException {

        // 1. 校验文本参数
        if (prompt == null || prompt.trim().isEmpty()) {
            return "请输入提问内容";
        }

        // 2. 处理文件（转Base64拼接到prompt）
        String fileInfo = "";
        if (files != null && files.length > 0) {
            try {
                MultipartFile file = files[0];
                byte[] fileBytes = file.getBytes();
                String base64 = Base64.getEncoder().encodeToString(fileBytes);
                fileInfo = "\n【附带文件】文件名：" + file.getOriginalFilename() +
                        "，文件Base64内容：" + base64 + "（请基于文件内容回答问题）";
            } catch (Exception e) {
                fileInfo = "\n【文件解析失败】：" + e.getMessage();
            }
        }
        String fullPrompt = prompt + fileInfo;

        // 3. 获取当前会话（根据chatId，不存在则创建新会话）
        ChatSession session = sessionManager.getSession(chatId);
        List<Message> historyMessages = session.getHistoryMessages(); // 历史消息列表

        // 4. 构建完整的消息列表（系统消息 + 历史消息 + 新的用户消息）
        // 添加系统消息（每次都添加，确保AI角色一致）
        messages.add(Message.builder()
                .role(Role.SYSTEM.getValue())
                .content(SYSTEM_PROMPT)
                .build());
        // 添加历史消息（之前的对话记录）
        messages.addAll(historyMessages);
        // 添加新的用户消息
        Message newUserMessage = Message.builder()
                .role(Role.USER.getValue())
                .content(fullPrompt)
                .build();
        messages.add(newUserMessage);

        // 5. 调用百炼API（传入完整上下文）
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope.aliyuncs.com/api/v1");
        GenerationParam param = GenerationParam.builder()
                .apiKey(DASHSCOPE_API_KEY)
                .model("qwen3-max")
                .messages(messages) // 关键：传入包含历史的完整消息列表
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        GenerationResult result = gen.call(param);
        String aiReply = result.getOutput().getChoices().get(0).getMessage().getContent();

        // 6. 保存新消息到历史记录（用户消息 + AI回复）
        session.addMessage(newUserMessage); // 保存用户消息
        session.addMessage(Message.builder() // 保存AI回复
                .role(Role.ASSISTANT.getValue())
                .content(aiReply)
                .build());

        // 7. 返回AI回复（可选：同时返回chatId，供前端下次请求使用）
        // 这里简化处理，只返回回复内容，实际可返回JSON包含chatId和reply
        return aiReply;
    }
}